package com.gee.spring.boot.rpf.client.calculator;

import com.gee.spring.boot.rpf.client.BaseClientResponse;
import com.gee.spring.boot.rpf.common.constant.FactorConstant;
import com.gee.thread.flow.common.result.ExecuteState;

/**
 * desc:
 *    计算器
 * @author gee wrote on  2021-02-06 14:43:30
 */
public interface Calculator {

    /**
     *  计算所需结果
     * @param executeState 当前接口的运行状态
     * @param response  接口返回结果
     * @param factorType 因子的类型
     * @param otherParam 除了本接口的返回结果, 所需的其他参数
     * @return  计算结果
     */
    Object calculate(ExecuteState executeState, BaseClientResponse response, Class factorType,
                     Object... otherParam);

    /**
     *  接口调用异常时, 返回结果
     * @param factorType 因子类型
     * @return 异常时的结果
     */
    default Object getClientExceptionFactor(Class factorType){
        if (FactorConstant.FACTOR_TYPE_INTEGER.equals(factorType.getName())){
            return FactorConstant.FACTOR_RESULT_INTEGER_CLIENT_EXCEPTION;
        }else if (FactorConstant.FACTOR_TYPE_DOUBLE.equals(factorType.getName())){
            return FactorConstant.FACTOR_RESULT_DOUBLE_CLIENT_EXCEPTION;
        }else {
            return FactorConstant.FACTOR_RESULT_STRING_CLIENT_EXCEPTION;
        }
    }

    /**
     *  接口正常调用, 但是返回码为非成功码值时的返回
     * @param factorType 因子类型
     * @return 加工结果
     */
    default Object getResponseCodeNotSuccessFactor(Class factorType){
        if (FactorConstant.FACTOR_TYPE_INTEGER.equals(factorType.getName())){
            return FactorConstant.FACTOR_RESULT_INTEGER_RESPONSE_CODE_NOT_SUCCESS;
        }else if (FactorConstant.FACTOR_TYPE_DOUBLE.equals(factorType.getName())){
            return FactorConstant.FACTOR_RESULT_DOUBLE_RESPONSE_CODE_NOT_SUCCESS;
        }else {
            return FactorConstant.FACTOR_RESULT_STRING_RESPONSE_CODE_NOT_SUCCESS;
        }
    }

    /**
     *  如果因子仅需要一个参数时, 参数为null时的加工
     * @param factorType 因子类型
     * @return 加工结果
     */
    default Object getParamNullFactor(Class factorType){
        if (FactorConstant.FACTOR_TYPE_INTEGER.equals(factorType.getName())){
            return FactorConstant.FACTOR_RESULT_INTEGER_PARA_IS_NULL;
        }else if (FactorConstant.FACTOR_TYPE_DOUBLE.equals(factorType.getName())){
            return FactorConstant.FACTOR_RESULT_DOUBLE_PARA_IS_NULL;
        }else {
            return FactorConstant.FACTOR_RESULT_STRING_PARA_IS_NULL;
        }
    }

    /**
     *  正常加工
     * @param factorType 因子类型
     * @return 加工结果
     */
    default Object getNormalFactor(Class factorType, Object value) throws Exception{
        if (FactorConstant.FACTOR_TYPE_INTEGER.equals(factorType.getName())){
            return Integer.parseInt(value.toString());
        }else if (FactorConstant.FACTOR_TYPE_DOUBLE.equals(factorType.getName())){
            return Double.parseDouble(value.toString());
        }else {
            return value.toString();
        }
    }

    /**
     *  因子进行计算时异常了的返回
     * @param factorType 因子类型
     * @return 加工结果
     */
    default Object getCalculateExceptionFactor(Class factorType){
        if (FactorConstant.FACTOR_TYPE_INTEGER.equals(factorType.getName())){
            return FactorConstant.FACTOR_RESULT_INTEGER_CALCULATE_EXCEPTION;
        }else if (FactorConstant.FACTOR_TYPE_DOUBLE.equals(factorType.getName())){
            return FactorConstant.FACTOR_RESULT_DOUBLE_CALCULATE_EXCEPTION;
        }else {
            return FactorConstant.FACTOR_RESULT_STRING_CALCULATE_EXCEPTION;
        }
    }
}
